package com.han.core.domain.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.doudian.open.api.sku_list.data.CustomsReportInfo;
import com.doudian.open.api.sku_list.data.SellPropertiesItem;
import com.doudian.open.api.sku_list.data.ShipRuleMapItem;
import lombok.Data;

/**
 * 
 * @TableName product_sku
 */
@Data
public class ProductSku implements Serializable {
    /**
     * 本系统中id
     */
    @TableId(type = IdType.ASSIGN_ID)
    private Long ownId;

    /**
     * 商品sku_id;抖店系统生成
     */
    private Long skuId;

    private Long shopId;

    /**
     * app_key
     */
    private Long openUserId;

    /**
     * 外部的skuId；商家自定义；未设置返回为0。
     */
    private Long outSkuId;

    /**
     * 商品ID；抖店系统生成。
     */
    private Long productId;

    /**
     * 第一级子规格
     */
    private Long specDetailId1;

    /**
     * 第二级子规格
     */
    private Long specDetailId2;

    /**
     * 第三级子规格
     */
    private Long specDetailId3;

    /**
     * 第一级子规格名
     */
    private String specDetailName1;

    /**
     * 第二级子规格名
     */
    private String specDetailName2;

    /**
     * 第三级子规格名
     */
    private String specDetailName3;



    /**
     * 商品价格，单位：分
     */
    private Long price;

    /**
     * 结算价格，【已废弃】价格字段是price
     */
    private Long settlementPrice;

    /**
     * 规格ID
     */
    private Long specId;

    /**
     * 创建时间，时间戳：单位秒；
     */
    private Date createTime;

    /**
     * sku外部编码
     */
    private String code;

    /**
     * 库存类型；0-普通；1-区域库存；10-阶梯库存；
     */
    private Long skuType;

    /**
     * 供应商ID
     */
    private String supplierId;

    /**
     * sku_type=0时，表示普通库存数量 ;sku_type=1时，使用stock_map，表示区域库存数量
     */
    private Long stockNum;

    /**
     * sku_type=0时，表示预占库存数量； sku_type=1时，表示区域库存数量，使用prehold_stock_map
     */
    private Long preholdStockNum;

    /**
     * 活动库存
     */
    private Long promStockNum;

    /**
     * 阶梯库存
     */
    private Long stepStockNum;

    /**
     * 预占阶梯库存
     */
    private Long preholdStepStockNum;

    /**
     * 活动阶梯库存
     */
    private Long promStepStockNum;
    /**
     * 商品 ID字符串类型
     */
    private String productIdStr;
    /**
     * 海南免税：是否套装，0 否，1 是
     */
    private Integer isSuit;

    /**
     * 海南免税：套装数量
     */
    private Long suitNum;

    /**
     * 海南免税：净含量
     */
    private Long volume;

    /**
     * 库存模型V2新增 普通库存 非活动可售
     */
    private Long normalStockNum;

    /**
     * 库存模型V2新增 渠道库存
     */
    private Long channelStockNum;

    /**
     * 销售属性，代替spec_detail_id123、spec_detail_name123
     */
    private String sellPropertiesJsonStr;

    /**
     * 如果sku_type=0，为空 如果sku_type=1，则为区域仓库存映射表，key为out_warehouse_id（区域仓库id使用【/warehouse/list】查询），value为sku 在对应仓中的发货时效
     */
    @TableField(exist = false)
    private Map<String, ShipRuleMapItem> shipRuleMap;

    private String shipRuleMapJsonStr;
    /**
     * 如果sku_type=0，为空 如果sku_type=1，则为区域仓库存映射表，key为out_warehouse_id（区域仓库id使用【/warehouse/list】查询），value为库存
     */
    @TableField(exist = false)
    private Map<String,Long> stockMap;

    private String stockMapJsonStr;

    /**
     * 如果sku_type=0，为空 如果sku_type=1，则为区域仓库存映射表，key为out_warehouse_id（区域仓库id使用【/warehouse/list】查询），value为占用库存
     */
    @TableField(exist = false)
    private Map<String,Long> preholdStockMap;

    private String preholdStockMapJsonStr;

    @TableField(exist = false)
    private List<SellPropertiesItem> sellPropertiesArray;

    @TableField(exist = false)
    private CustomsReportInfo customsReportInfoItem;

    public void setStockMapJsonStr(String stockMapJsonStr) {
        this.stockMapJsonStr = stockMapJsonStr;
        if(CollectionUtil.isEmpty(stockMap)){
            //根据有效数据来进行切割，后续找到有效数据进行查看；
//            stockMapJsonStr.split("，");
        }
    }
    public void setShipRuleJsonStr(String shipRuleJsonStr){
        this.shipRuleMapJsonStr = shipRuleJsonStr;
        if(CollectionUtil.isEmpty(shipRuleMap)){
            ///根据有效数据来进行切割，后续找到有效数据进行查看；
        }
    }
    public void setPreholdStockMapJsonStr(String str){
        this.shipRuleMapJsonStr = str;
        if(CollectionUtil.isEmpty(shipRuleMap)){
            //根据有效数据来进行切割，后续找到有效数据进行查看；
        }
    }

    /**
     * 海关申报要素
     */
    private String customsReportInfoJsonStr;

    //设置时，转换为对象
    public void setCustomsReportInfoJsonStr(String jsonStr) {
        this.customsReportInfoJsonStr = jsonStr;
        if(ObjectUtil.isNull(customsReportInfoItem)){
            CustomsReportInfo object = JSONObject.parseObject(jsonStr, CustomsReportInfo.class);
            this.setCustomsReportInfoItem(object);
        }
    }
    //设置时转换为对象数组
    public void setSellPropertiesJsonStr(String jsonStr) {
        this.sellPropertiesJsonStr = jsonStr;
        if(ObjectUtil.isNull(sellPropertiesArray) || sellPropertiesArray.isEmpty()){
            List<SellPropertiesItem> list = JSONArray.parseArray(jsonStr, SellPropertiesItem.class);
            this.setSellPropertiesArray(list);
        }
    }


    private static final long serialVersionUID = 1L;
}